package gameobjects;

import javagame.*;

import org.newdawn.slick.*;

public class Brod extends Protivnik {

	//POLJA KLASE
	private static int startHP = 4;
	
	private Image HP_bar;//bar za prikazivanje preostale snage
	private int smerMetka;//smer u kojem treba pucati, posto brod ne menja pravac pri pucanju
	private int[] duration = {500, 500};//treba sporije da se menjaju slike nego kod ostalih protivnika
	
	//KONSTRUKTOR

	public Brod(Igrac igrac, Igrac2 igrac2, Level nivo) {
		super(igrac, igrac2, nivo);
		this.setHP(startHP);
		this.setVrsta(tip_protivnika.BROD);
		this.smerMetka = 0;
		if (this.getSmer() == 0 || this.getSmer() == 1) {
			this.setSizeX(50);
			this.setSizeY(200);
		}
		else {
			this.setSizeX(200);
			this.setSizeY(50);
		}
		this.setZid(0);//ako bude trebalo ovo promeni
		this.setBrojTopova(2);
		this.dodajTop(0, 75, 45, 75, 5, 45, 75, 5, 75);
		this.dodajTop(1, 125, 45, 125, 5, 45, 125, 5, 125);
		this.setProtivnikPomerajX(185);
		this.setProtivnikPomerajY(185);
	}
	
	//GET I SET METODE
	
	public Image getHP_bar() {
		return HP_bar;
	}

	public void setHP_bar(Image hPBar) {
		HP_bar = hPBar;
	}
	
	public int getSmerMetka() {
		return smerMetka;
	}

	public void setSmerMetka(int smerMetka) {
		this.smerMetka = smerMetka;
	}

	public int[] getDuration() {
		return duration;
	}

	public void setDuration(int[] duration) {
		this.duration = duration;
	}
	
	//PUCANJE
	
	//preklopljena metoda klase Protivnik
	public void pucanje(boolean belo) throws SlickException {
		for(int i=0;i<this.getBrojTopova();i++) {
			//levo
			if(smerMetka == 3) pucaj(this.getProtivnikX() + this.getKordTop(i).getSmer3X(), this.getProtivnikY() + this.getKordTop(i).getSmer3Y(), smerMetka, belo);
			//desno
			if(smerMetka == 2) pucaj(this.getProtivnikX() + this.getKordTop(i).getSmer2X(), this.getProtivnikY() + this.getKordTop(i).getSmer2Y(), smerMetka, belo);
			//gore
			if(smerMetka == 1) pucaj(this.getProtivnikX() + this.getKordTop(i).getSmer1X(), this.getProtivnikY() + this.getKordTop(i).getSmer1Y(), smerMetka, belo);
			//dole
			if(smerMetka == 0) pucaj(this.getProtivnikX() + this.getKordTop(i).getSmer0X(), this.getProtivnikY() + this.getKordTop(i).getSmer0Y(), smerMetka, belo);
		}
	}
	
	//preklopljena metoda klase Protivnik
	public void firing(int smer, boolean belo) throws SlickException {
		this.incMetakO();
		if(this.getMetakOdbrojavanje() == 0) {
			smerMetka=smer;
			pucanje(belo);
			this.setMetakOdbrojavanje(10);
		}
	}
	
	//KRETANJE
	
	public void move(int delta, Kolizija kolizija) {
		kreciSe(delta, kolizija);
		if(!this.getNivo().mozeFull(kolizija.getObjekatVoda(), this.getProtivnikX(), this.getProtivnikY(), this.getSizeX(), this.getSizeY())
				|| !this.getNivo().mozeProtivnik(this))
			promeniSmer(delta, kolizija);
		else promenaSmeraKrajNivoa(delta, kolizija);
	}
	
	//promena smera kretanja
	public void promeniSmer(int delta, Kolizija kolizija) {
		if (this.isShooting() == true) this.setStop(true);
		else 
			if(this.getSmer() == 2)	{
				this.setSmer(3);
				promeniAnimaciju();
				this.setProtivnikX(this.getProtivnikX() - delta * .1f);
			}
			else if(this.getSmer() == 3) {
				this.setSmer(2);
				promeniAnimaciju();
				this.setProtivnikX(this.getProtivnikX() + delta * .1f);
			}
			else if(this.getSmer() == 1) {
				this.setSmer(0);
				promeniAnimaciju();
				this.setProtivnikY(this.getProtivnikY() + delta * .1f);
			}
			else if(this.getSmer() == 0) {
				this.setSmer(1);
				promeniAnimaciju();
				this.setProtivnikY(this.getProtivnikY() - delta * .1f);
			}
		}
	
	public void promenaSmeraKrajNivoa(int delta, Kolizija kolizija) {
		if(this.getProtivnikX() >= 1024 - this.getSizeX()) {
			this.setSmer(3);
			promeniAnimaciju();
			this.setProtivnikX(this.getProtivnikX() - delta * .1f);
		}
		else if(this.getProtivnikX() <= 0) {
			this.setSmer(2);
			promeniAnimaciju();
			this.setProtivnikX(this.getProtivnikX() + delta * .1f);
		}
		if(this.getProtivnikY() >= 768 - this.getSizeY()) {
			this.setSmer(1);
			promeniAnimaciju();
			this.setProtivnikY(this.getProtivnikY() - delta * .1f);
		}
		else if(this.getProtivnikY() <= this.getZid()) {
			this.setSmer(0);
			promeniAnimaciju();
			this.setProtivnikY(this.getProtivnikY() + delta * .1f);
		}
	}
		
	//AI BRODA
	
	public void protivnikAI(int delta, Kolizija kolizija, boolean belo) throws SlickException {
		if(this.isUbiven() == false) {
			move(delta/2, kolizija);
			fire(belo);
		}
	}
	
	//CRTANJE
	
	//postavljanje animacije
	public void setAnimation() throws SlickException {
		Image [] up = {new Image("res/brod_gore1.png"), new Image("res/brod_gore2.png")};
		Image [] down = {new Image("res/brod_dole1.png"), new Image("res/brod_dole2.png")};
		Image [] left = {new Image("res/brod_levo1.png"), new Image("res/brod_levo2.png")};
		Image [] right = {new Image("res/brod_desno1.png"), new Image("res/brod_desno2.png")};
		this.setMovingUp(new Animation(up, duration, true));//true se stavlja zbog autoupdate
		this.setMovingDown(new Animation(down, duration, true));
		this.setMovingLeft(new Animation(left, this.getDuration(), true));
		this.setMovingRight(new Animation(right, this.getDuration(), true));
		if(this.getSmer() == 0) this.setProtivnik(this.getMovingDown());
		if(this.getSmer() == 1) this.setProtivnik(this.getMovingUp());
		if(this.getSmer() == 2) this.setProtivnik(this.getMovingRight());
		if(this.getSmer() == 3) this.setProtivnik(this.getMovingLeft());
	}
	
	//iscrtavanje broda i health bara
	public void crtaj(Graphics g) throws SlickException {
		super.crtaj(g);
		
		Color stara = g.getColor();
		g.setColor(Igrac.DARK_RED);
		g.fillRect(getProtivnikX(), getProtivnikY()-20, 50, 10);
		g.setColor(Igrac.LIME);
		g.fillRect(getProtivnikX(), getProtivnikY()-20, 50*getHP()/startHP, 10);
		g.setColor(Color.black);
		g.drawRect(getProtivnikX(), getProtivnikY()-20, 50, 10);
		g.setColor(stara);
	}
	
	public void ozivi() {
		super.ozivi();
		this.setHP(startHP);
	}

}
